package com.hedl.practice.StudyAlgorithm.bubble_sorting;

import java.util.Arrays;

public class BubbleSorting {
    /**
     * 首先判断数组是否为空或长度为0，如果是则直接返回。
     * 使用两层循环，外层循环控制排序的轮数，内层循环对相邻的元素进行比较和交换。
     * 对于每一轮排序，从第一个元素开始，依次比较相邻的两个元素，如果前一个元素大于后一个元素，则交换它们的位置。
     * 重复步骤3，直到遍历完整个数组。
     * 重复步骤2和3，直到排序完成。
     * @param arr
     */
    public void bubbleSorting(Integer[] arr){
        if (arr == null || arr.length == 0) {
            return;
        }
        for (int i = 0; i < arr.length - 1; i++) {
            for (int j = 0; j < arr.length - 1 - i; j++) {
                if (arr[j] > arr[j + 1]) {
                    Integer temp = arr[j];
                    arr[j] = arr[j + 1];
                    arr[j + 1] = temp;
                }
            }
        }
    }

    /**
     * 首先判断数组是否为空或长度为0，如果是则直接返回。
     * 初始化左右两个指针left和right，分别指向数组的第一个元素和最后一个元素。
     * 使用while循环，循环条件为left小于right。
     * 在循环中，先从左向右冒泡，对相邻的元素进行比较和交换，将最大的元素移到最后面。
     * 然后将right指针向左移动一位。
     * 接着从右向左冒泡，对相邻的元素进行比较和交换，将最小的元素移到最前面。
     * 最后将left指针向右移动一位。
     * 重复步骤4到7，直到left大于等于right。
     * 排序完成。
     * @param arr
     */
    public void cocktailSort(Integer[] arr) {
        if (arr == null || arr.length == 0) {
            return;
        }
        int left = 0;
        int right = arr.length - 1;
        while (left < right) {
            // 从左向右冒泡
            for (int i = left; i < right; i++) {
                if (arr[i] > arr[i + 1]) {
                    int temp = arr[i];
                    arr[i] = arr[i + 1];
                    arr[i + 1] = temp;
                }
            }
            right--;
            // 从右向左冒泡
            for (int i = right; i > left; i--) {
                if (arr[i] < arr[i - 1]) {
                    int temp = arr[i];
                    arr[i] = arr[i - 1];
                    arr[i - 1] = temp;
                }
            }
            left++;

            System.out.println("结果"+": "+Arrays.toString(arr));
        }
    }


    public static void main(String[] args) {
        //Integer[] arr = {3, 1, 4, 1, 5, 9, 2, 6, 5, 3, 5};
        //new BubbleSorting().bubbleSorting(arr);
        //System.out.println(Arrays.toString(arr));

        Integer[] arr1 = {99,72,34,24,58,64,12,77,33,11,76,98,90,99,25};
        new BubbleSorting().cocktailSort(arr1);
        System.out.println("最终双向冒泡排序结果："+Arrays.toString(arr1));

        System.out.println(arr1.length);
        new BubbleSorting().bubbleSorting(arr1);
        System.out.println(Arrays.toString(arr1));
    }
}
